/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.common.client.tools;
import java.util.ArrayList;
import java.util.List;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.index.FindRequest;
import org.roda.core.data.v2.index.IsIndexed;
import org.roda.core.data.v2.index.facet.Facets;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.sort.Sorter;
import org.roda.core.data.v2.index.sublist.Sublist;
import org.roda.core.data.v2.ip.IndexedFile;
import com.github.nmorel.gwtjackson.client.ObjectMapper;
import com.google.gwt.core.client.GWT;
import com.google.gwt.http.client.URL;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.safehtml.shared.UriUtils;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitHandler;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.RootPanel;
public class RestUtils {
private RestUtils() {
// do nothing
}
public static SafeUri createAIPDownloadUri(String aipId) {
// api/v1/aips/{aip_id}/?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createAIPPartDownloadUri(String aipId, String part) {
// api/v1/aips/{aip_id}/{part}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP)
.append(URL.encodeQueryString(part));
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createRepresentationDownloadUri(String aipId, String representationId) {
// api/v1/representations/{aip_id}/{representation_id}/?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_REPRESENTATIONS).append(URL.encodeQueryString(aipId))
.append(RodaConstants.API_SEP).append(URL.encodeQueryString(representationId)).append(RodaConstants.API_SEP);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createRepresentationPartDownloadUri(String aipId, String representationId, String part) {
// api/v1/representations/{aip_id}/{representation_id}/{part}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_REPRESENTATIONS).append(URL.encodeQueryString(aipId))
.append(RodaConstants.API_SEP).append(URL.encodeQueryString(representationId)).append(RodaConstants.API_SEP)
.append(URL.encodeQueryString(part));
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createRepresentationFileDownloadUri(String fileUuid) {
// api/v1/files/{file_uuid}?acceptFormat=bin
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_FILES).append(URL.encodeQueryString(fileUuid));
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_BIN);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createDipDownloadUri(String dipUUID) {
// api/v1/dips/{dip_uuid}?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_DIPS).append(URL.encodeQueryString(dipUUID));
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createDipFileDownloadUri(String dipFileUUID) {
// api/v1/dipfiles/{file_uuid}?acceptFormat=bin
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_DIPFILES).append(URL.encodeQueryString(dipFileUUID));
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_BIN);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createDescriptiveMetadataDownloadUri(String aipId) {
// api/v1/aips/{aip_id}/descriptive_metadata/?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createDescriptiveMetadataDownloadUri(String aipId, String descId) {
return createDescriptiveMetadataDownloadUri(aipId, descId, null);
}
public static SafeUri createDescriptiveMetadataDownloadUri(String aipId, String descId, String versionId) {
// api/v1/aips/{aip_id}/descriptive_metadata/{descId}?acceptFormat=xml&version_id={versionId}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP).append(descId);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_BIN);
if (versionId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_VERSION_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(versionId);
}
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createDescriptiveMetadataHTMLUri(String aipId, String descId) {
return createDescriptiveMetadataHTMLUri(aipId, descId, null);
}
public static SafeUri createDescriptiveMetadataHTMLUri(String aipId, String descId, String versionId) {
// api/v1/aips/{aip_id}/descriptive_metadata/{descId}?acceptFormat=html&version_id={versionId}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP).append(descId);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML);
if (versionId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_VERSION_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(versionId);
}
// locale
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_KEY_LANG)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(LocaleInfo.getCurrentLocale().getLocaleName());
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createPreservationMetadataDownloadUri(String aipId) {
// api/v1/aips/{aip_id}/preservation_metadata/?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_AIPS).append(URL.encodeQueryString(aipId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_PRESERVATION_METADATA).append(RodaConstants.API_SEP);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
return UriUtils.fromSafeConstant(b.toString());
}
public static String createRepresentationPreservationMetadataUri(String aipId, String representationId,
int startAgent, int limitAgent, int startEvent, int limitEvent, int startFile, int limitFile) {
// api/v1/representations/{aip_id}/{representation_id}/descriptive_metadata/?acceptFormat=zip
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_REPRESENTATIONS).append(URL.encodeQueryString(aipId))
.append(RodaConstants.API_SEP).append(URL.encodeQueryString(representationId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_PRESERVATION_METADATA).append(RodaConstants.API_SEP);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_ZIP);
// start and limits
b.append(RodaConstants.API_QUERY_SEP).append("startAgent").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(startAgent);
b.append(RodaConstants.API_QUERY_SEP).append("limitAgent").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(limitAgent);
b.append(RodaConstants.API_QUERY_SEP).append("startEvent").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(startEvent);
b.append(RodaConstants.API_QUERY_SEP).append("limitEvent").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(limitEvent);
b.append(RodaConstants.API_QUERY_SEP).append("startFile").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(startFile);
b.append(RodaConstants.API_QUERY_SEP).append("limitFile").append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(limitFile);
// locale
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_KEY_LANG)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(LocaleInfo.getCurrentLocale().getLocaleName());
return b.toString();
}
public static SafeUri createRepresentationDescriptiveMetadataDownloadUri(String aipId, String representationId,
String descId) {
return createRepresentationDescriptiveMetadataDownloadUri(aipId, representationId, descId, null);
}
public static SafeUri createRepresentationDescriptiveMetadataDownloadUri(String aipId, String representationId,
String descId, String versionId) {
// api/v1/representations/{aip_id}/{representation_id}/descriptive_metadata/{descId}?acceptFormat=xml&version_id={versionId}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_REPRESENTATIONS).append(URL.encodeQueryString(aipId))
.append(RodaConstants.API_SEP).append(URL.encodeQueryString(representationId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP).append(descId);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_BIN);
if (versionId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_VERSION_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(versionId);
}
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createRepresentationDescriptiveMetadataHTMLUri(String aipId, String representationId,
String descId) {
return createRepresentationDescriptiveMetadataHTMLUri(aipId, representationId, descId, null);
}
public static SafeUri createRepresentationDescriptiveMetadataHTMLUri(String aipId, String representationId,
String descId, String versionId) {
// api/v1/representations/{aip_id}/{representation_id}/descriptive_metadata/{descId}?acceptFormat=html&version_id={versionId}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_REPRESENTATIONS).append(URL.encodeQueryString(aipId))
.append(RodaConstants.API_SEP).append(URL.encodeQueryString(representationId)).append(RodaConstants.API_SEP)
.append(RodaConstants.API_DESCRIPTIVE_METADATA).append(RodaConstants.API_SEP).append(descId);
// accept format attribute
b.append(RodaConstants.API_QUERY_START).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML);
if (versionId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_VERSION_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(versionId);
}
// locale
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_KEY_LANG)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(LocaleInfo.getCurrentLocale().getLocaleName());
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createPreservationEventDetailsHTMLUri(String eventId, String aipId, String representationUUID,
String fileUUID) {
// api/v1/events?id={event_id}&aipId={aip_id}&representationUUID={representationUUID}&fileUUID={fileUUID}&onlyDetails=true&acceptFormat=html&lang={lang}
StringBuilder b = new StringBuilder();
b.append(RodaConstants.API_REST_V1_EVENTS).append(RodaConstants.API_QUERY_START)
.append(RodaConstants.API_QUERY_PARAM_ID).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(URL.encodeQueryString(eventId));
if (aipId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_PATH_PARAM_AIP_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(URL.encodeQueryString(aipId));
}
if (representationUUID != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_PATH_PARAM_REPRESENTATION_UUID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(URL.encodeQueryString(representationUUID));
}
if (fileUUID != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_PATH_PARAM_FILE_UUID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(URL.encodeQueryString(fileUUID));
}
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_ONLY_DETAILS)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(URL.encodeQueryString(Boolean.toString(true)));
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(URL.encodeQueryString(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_HTML));
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_KEY_LANG)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(LocaleInfo.getCurrentLocale().getLocaleName());
return UriUtils.fromSafeConstant(b.toString());
}
public static String createTransferredResourceUploadUri(String parentUUID, String locale) {
// api/v1/transfers/?parentUUID={parentUUID}&locale={locale}&commit=true
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_RESOURCES);
if (parentUUID != null || locale != null) {
b.append(RodaConstants.API_QUERY_START);
}
if (parentUUID != null) {
b.append(RodaConstants.TRANSFERRED_RESOURCE_PARENT_UUID).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(parentUUID);
}
if (parentUUID != null && locale != null) {
b.append(RodaConstants.API_QUERY_SEP);
}
if (locale != null) {
b.append(RodaConstants.LOCALE).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(locale)
.append(RodaConstants.API_QUERY_SEP);
}
b.append(RodaConstants.API_QUERY_PARAM_COMMIT).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append("True");
return b.toString();
}
public static String createFileUploadUri(IndexedFile folder, String details) {
// api/v1/files?aipId={aipId}&representationId={representationdId}&folder={folder[0]}&folder={folder[1]}&details={details}
List<String> directory = new ArrayList<>(folder.getPath());
directory.add(folder.getId());
return createFileUploadUri(folder.getAipId(), folder.getRepresentationId(), directory, details);
}
public static String createFileUploadUri(String aipId, String representationId, List<String> directory,
String details) {
// api/v1/files?aipId={aipId}&representationId={representationdId}&folder={folder[0]}&folder={folder[1]}&details={details}
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_FILES).append(RodaConstants.API_QUERY_START);
b.append(RodaConstants.API_PATH_PARAM_AIP_ID).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(URL.encodeQueryString(aipId));
b.append(RodaConstants.API_QUERY_SEP);
b.append(RodaConstants.API_PATH_PARAM_REPRESENTATION_ID).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(URL.encodeQueryString(representationId));
b.append(RodaConstants.API_QUERY_SEP);
for (String folderPath : directory) {
b.append(RodaConstants.API_PATH_PARAM_FOLDER).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(URL.encodeQueryString(folderPath));
b.append(RodaConstants.API_QUERY_SEP);
}
b.append(RodaConstants.API_QUERY_PARAM_DETAILS).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(details);
return b.toString();
}
public static SafeUri createTransferredResourceDownloadUri(String resourceId) {
// api/v1/transferred/{transferred_resource_uuid}?acceptFormat=bin
StringBuilder b = new StringBuilder();
// base uri
b.append(RodaConstants.API_REST_V1_RESOURCES).append(resourceId).append(RodaConstants.API_QUERY_START)
.append(RodaConstants.API_QUERY_KEY_ACCEPT_FORMAT).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(RodaConstants.API_QUERY_VALUE_ACCEPT_FORMAT_BIN);
return UriUtils.fromSafeConstant(b.toString());
}
public static SafeUri createThemeResourceUri(String resourceId, String defaultResourceId, boolean inline) {
// api/v1/theme/?resource_id={resourceId}&default_resource_od={defaultResourceId}
StringBuilder b = new StringBuilder();
b.append(RodaConstants.API_REST_V1_THEME).append(RodaConstants.API_QUERY_START)
.append(RodaConstants.API_QUERY_PARAM_RESOURCE_ID).append(RodaConstants.API_QUERY_ASSIGN_SYMBOL)
.append(resourceId);
if (defaultResourceId != null) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_DEFAULT_RESOURCE_ID)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(defaultResourceId);
}
if (inline) {
b.append(RodaConstants.API_QUERY_SEP).append(RodaConstants.API_QUERY_PARAM_INLINE)
.append(RodaConstants.API_QUERY_ASSIGN_SYMBOL).append(inline);
}
return UriUtils.fromSafeConstant(b.toString());
}
public static interface FindRequestMapper extends ObjectMapper<FindRequest> {
}
private static FindRequestMapper FIND_REQUEST_MAPPER = GWT.create(FindRequestMapper.class);
public static <T extends IsIndexed> void requestCSVExport(Class<T> classToReturn, Filter filter, Sorter sorter,
Sublist sublist, Facets facets, boolean onlyActive, boolean exportFacets, String filename) {
// api/v1/index/findFORM?type=csv
String url = RodaConstants.API_REST_V1_INDEX + "findFORM";
FindRequest request = new FindRequest(classToReturn.getName(), filter, sorter, sublist, facets, onlyActive,
exportFacets, filename);
final FormPanel form = new FormPanel();
form.setAction(URL.encode(url));
form.setMethod(FormPanel.METHOD_POST);
form.setEncoding(FormPanel.ENCODING_URLENCODED);
FlowPanel layout = new FlowPanel();
form.setWidget(layout);
layout.add(new Hidden("findRequest", FIND_REQUEST_MAPPER.write(request)));
layout.add(new Hidden("type", "csv"));
form.setVisible(false);
RootPanel.get().add(form);
// using submit instead of submit completed because Chrome doesn't created
// the other event
form.addSubmitHandler(new SubmitHandler() {
@Override
public void onSubmit(SubmitEvent event) {
Timer timer = new Timer() {
@Override
public void run() {
RootPanel.get().remove(form);
}
};
// remove form 10 seconds in the future
timer.schedule(10000);
}
});
form.submit();
}
}